Exercise 1

Exercise 2

Overall

Seattle

Observing how raceproportion significance on spatial mismatch with correlation testing.

Baltimore

PCA

Seattle

##Seattle Model 2

\[ \widehat{Spatial Mismatch} = e^{-0.122946 \cdot PC1 -2.663302} \]

This has an \[ R^{2}_{adj} = 0.16\] We used a logarthmic transformation on spatial mismatch since the linearity model had skewness to the right. Additionally, the normality probability plot suggests a slight upward trend reminsicient of a log/polynomial transformation.

Furthermore, our current \[ R^{2}_{adj} \] has increased from \[ R^{2}_{adj} = 0.13\]. Despite the smaller increase our our predictors we have decieded to go with a simpler model because of the readibility in the interaction between Principal Component 1 and Spatial Mismatch. Recall that Principal Component 1 main contributors were our original variables \(\textit{BachelorProp}\) and \(\textit{hsdiplomaProp}\). These variables contrasted each other. The variable \(\textit{hsdiplomaProp}\) has a negative weight of \(-0.43\) which suggests that as the proportion of people who have a high school diploma than typical increase Principal Component 1 will decrease. Since Princpal Component 1 has a negative weight in our overall model, we can say that that there are a higher proportion than average of people who have a high school diploma.

## 
## Call:
## lm(formula = logspatialmismatch ~ PC1, data = Seattle2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1717 -0.2597  0.0263  0.2928  1.5678 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.663302   0.009401 -283.30   <2e-16 ***
## PC1         -0.122946   0.005758  -21.35   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4678 on 2474 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1556, Adjusted R-squared:  0.1553 
## F-statistic: 455.9 on 1 and 2474 DF,  p-value: < 2.2e-16

## 
## Call:
## lm(formula = logspatialmismatch ~ logPC1, data = Seattle2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.2834 -0.2751  0.0417  0.3180  1.6089 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.84097    0.01530 -185.64   <2e-16 ***
## logPC1      -0.15240    0.01452  -10.49   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5208 on 1157 degrees of freedom
##   (1318 observations deleted due to missingness)
## Multiple R-squared:  0.08691,    Adjusted R-squared:  0.08612 
## F-statistic: 110.1 on 1 and 1157 DF,  p-value: < 2.2e-16

## [1] 357 904

Analysis Seattle Best Model:

Just as a reminder Principal Component 1 for Seattle heaviest weights consist of the variables \(\textit{hsdiplomaProp}\) which is the proportion of low-income people in block groups that have attained a high school education and \(\textit{bachelorProp}\) which is the proportion of low-income people in block groups that have attained a bachelors.

We see the proportion of low-income people who have attained their high school diploma in block groups is higher than average, the higher the spatial mismatch is. Especially looking at the graph when the Principal component One is between -2 and 0, spatial mismatch tends to increase.

Then as we see the proportion of low-income people who have attained their bacelor’s in block groups is higher than average, the lower the spatial mismatch is. We see that as get closer to 4, the spatial mismatch is close to 0.

Something interesting to note, is that amongst principal component 1, is that the variable \(\textit{HispanicrProp}\), \(\textit{BlackProp}\) and \(\textit{WhiteProp}\) are all relatively high as well. With $ = -0.37 $, \(\textit{BlackProp} = -0.29\) and \(\textit{WhiteProp} = 0.29\). In this case, we also see that as Hispanic proportions are higher than average in block groups, principal component 1 will decrease. Similarly, as Black proportions are higher than average in block groups principal component 1 will also decrease. Converslely as white proportions are higher than average in block groups, princpal component 1 will also increase.

We can say that in general we can say that principal component 1 primarily is seeing characteristics of education, with the heavy emphasis on high school diplomas and bachelor’s degrees.

Interpreting our results, we can see that this can be tied into education since historically Blacks and Hispanics have lower education levels compared to White and Asian populations. This can contribute to some of the spatial mismatch amongst low-income job seekers.

Seattle 3

Seattle Spatial PCA

Exact same model as orginal, despite different transformations

#Normalizing Data 

normalized_SeattleSpatial<- scale(Seattle_spatial)

#Compute Correlation Matrix

SeattleSpatialcorr_matrix <- cor(normalized_SeattleSpatial)
ggcorrplot(SeattleSpatialcorr_matrix, colors = c("#d8b365", "#f5f5f5", "#5ab4ac"))

#Application 

PCA_SeattleSpatial <-princomp(SeattleSpatialcorr_matrix)
summary(PCA_SeattleSpatial)
## Importance of components:
##                           Comp.1    Comp.2     Comp.3     Comp.4     Comp.5
## Standard deviation     0.9131271 0.6782956 0.30196739 0.27082069 0.22615237
## Proportion of Variance 0.5284011 0.2915676 0.05778583 0.04647987 0.03241183
## Cumulative Proportion  0.5284011 0.8199686 0.87775446 0.92423434 0.95664617
##                            Comp.6     Comp.7      Comp.8 Comp.9
## Standard deviation     0.20036499 0.15762603 0.058471772      0
## Proportion of Variance 0.02544163 0.01574552 0.002166675      0
## Cumulative Proportion  0.98208780 0.99783332 1.000000000      1
fviz_pca_var(PCA_SeattleSpatial, col.var = "black")

PCA_SeattleSpatial$loadings[, 1:2]
##                      Comp.1      Comp.2
## hsdiplomaProp    0.30636245  0.36745555
## college1Prop     0.13603557  0.39255954
## somecollegeProp  0.08701663  0.30998611
## assProp          0.01287675  0.23809938
## bachelorProp    -0.45329414 -0.33113369
## GEDProp          0.25521553  0.27477986
## p12Prop          0.46127318 -0.07529069
## WhiteProp       -0.44763678  0.42115562
## POCProp          0.44287299 -0.43577113
SeattleSpatialpcs<-as.matrix(normalized_SeattleSpatial %*% PCA_SeattleSpatial$loadings[, 1:2])
SeattleSpatialpc <- prcomp(Seattle_finality3, center = TRUE, scale. = TRUE)

Seattle3 <- as.data.frame(cbind(spatialmismatch=Seattle_finality$spatialmismatch, SeattleSpatialpc$x[,1:2]))

###Seattle Spatial Model 1

PC2 is not significant we are going to ignore it and focus on the relationship PC1 and spatial mismatch.

#Seattle Spatial Linear Regression with PCA

M2_PCA_SeattleSpatial <- lm(spatialmismatch ~ PC1 + PC2, data = Seattle3)

M21_PCA_SeattleSpatial <-lm(spatialmismatch ~ PC1, data=Seattle3)



summary(M21_PCA_SeattleSpatial)
## 
## Call:
## lm(formula = spatialmismatch ~ PC1, data = Seattle3)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.082157 -0.022923 -0.005411  0.016107  0.277901 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.0782017  0.0006958  112.39   <2e-16 ***
## PC1         -0.0080735  0.0004260  -18.95   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03463 on 2475 degrees of freedom
## Multiple R-squared:  0.1267, Adjusted R-squared:  0.1264 
## F-statistic: 359.2 on 1 and 2475 DF,  p-value: < 2.2e-16

Analyzing Residuals

qqnorm(M21_PCA_SeattleSpatial$resid)

hist(M21_PCA_SeattleSpatial$resid)

#trasnformation 

Seattle3$logspatialmismatch<- log(Seattle3$spatialmismatch)

Seattle3[is.na(Seattle3)| Seattle3 == "Inf"| Seattle3 == "-Inf"] = NA

M22_PCA_SeattleSpatial<- lm(logspatialmismatch~PC1, data=Seattle3)
summary(M22_PCA_SeattleSpatial)
## 
## Call:
## lm(formula = logspatialmismatch ~ PC1, data = Seattle3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1717 -0.2597  0.0263  0.2928  1.5678 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.663302   0.009401 -283.30   <2e-16 ***
## PC1         -0.122946   0.005758  -21.35   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4678 on 2474 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1556, Adjusted R-squared:  0.1553 
## F-statistic: 455.9 on 1 and 2474 DF,  p-value: < 2.2e-16
qqnorm(M22_PCA_SeattleSpatial$resid)

summary(lm(spatialmismatch ~ PC1 + I(PC1^2), data = Seattle3))
## 
## Call:
## lm(formula = spatialmismatch ~ PC1 + I(PC1^2), data = Seattle3)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.083368 -0.023477 -0.005039  0.015977  0.276032 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.0821969  0.0009319  88.200  < 2e-16 ***
## PC1         -0.0078079  0.0004246 -18.387  < 2e-16 ***
## I(PC1^2)    -0.0014974  0.0002347  -6.381  2.1e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03435 on 2474 degrees of freedom
## Multiple R-squared:  0.1409, Adjusted R-squared:  0.1402 
## F-statistic: 202.8 on 2 and 2474 DF,  p-value: < 2.2e-16
Baltimore_finality3 <- Baltimore_finality %>%
  select(WhiteProp,AsianProp, HispanicProp, BlackProp, hsdiplomaProp,hsnodiplomaProp,somecollegeProp,college1Prop,assProp,bachelorProp)


#Normalizing Data 

normalized_Baltimore<- scale(Baltimore_finality3)

#Compute Correlation Matrix

Baltimorecorr_matrix <- cor(normalized_Baltimore)
ggcorrplot(Baltimorecorr_matrix, colors = c("#d8b365", "#f5f5f5", "#5ab4ac"))

#Application 

PCA_Baltimore <-princomp(Baltimorecorr_matrix)
summary(PCA_Baltimore)
## Importance of components:
##                           Comp.1    Comp.2    Comp.3     Comp.4     Comp.5
## Standard deviation     0.9146061 0.4683604 0.3556335 0.28646943 0.27266128
## Proportion of Variance 0.5579587 0.1463168 0.0843605 0.05473818 0.04958847
## Cumulative Proportion  0.5579587 0.7042754 0.7886359 0.84337413 0.89296260
##                            Comp.6     Comp.7    Comp.8      Comp.9 Comp.10
## Standard deviation     0.25022145 0.21500609 0.2130455 0.079032559       0
## Proportion of Variance 0.04176215 0.03083439 0.0302746 0.004166255       0
## Cumulative Proportion  0.93472476 0.96555914 0.9958337 1.000000000       1
PCA_Baltimore$loadings[, 1:2]
##                      Comp.1       Comp.2
## WhiteProp        0.46412467  0.425302407
## AsianProp        0.22962986 -0.450309002
## HispanicProp     0.01412706 -0.233580886
## BlackProp       -0.50592518 -0.255519570
## hsdiplomaProp   -0.36562003  0.323135997
## hsnodiplomaProp -0.24195465 -0.007534153
## somecollegeProp -0.25237550  0.070823802
## college1Prop    -0.07966594  0.490120134
## assProp          0.05248039  0.355653811
## bachelorProp     0.45900353 -0.142451251
fviz_pca_var(PCA_Baltimore, col.var = "black")

Baltimorepcs<-as.matrix(normalized_Baltimore %*% PCA_Baltimore$loadings[, 1:2])

Baltimorepc <- prcomp(Baltimore_finality3, center = TRUE, scale. = TRUE)

Baltimore2 <- as.data.frame(cbind(spatialmismatch=Baltimore_finality$spatialmismatch, Baltimorepc$x[,1:2]))
# Baltimore Fitting Linear Model PCA


M1_PCA_Baltimore <- lm(spatialmismatch ~ PC1 + PC2, data = Baltimore2)

M11_PCA_Baltimore <-lm(spatialmismatch ~ PC2, data=Baltimore2)


summary(M1_PCA_Baltimore)
## 
## Call:
## lm(formula = spatialmismatch ~ PC1 + PC2, data = Baltimore2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.09429 -0.03602 -0.01009  0.02535  0.23800 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.0860580  0.0010714  80.323  < 2e-16 ***
## PC1         -0.0001101  0.0006290  -0.175 0.861030    
## PC2         -0.0032319  0.0008665  -3.730 0.000197 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04718 on 1936 degrees of freedom
## Multiple R-squared:  0.007151,   Adjusted R-squared:  0.006125 
## F-statistic: 6.972 on 2 and 1936 DF,  p-value: 0.0009619
summary(M11_PCA_Baltimore)
## 
## Call:
## lm(formula = spatialmismatch ~ PC2, data = Baltimore2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.09433 -0.03617 -0.01014  0.02542  0.23814 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.0860580  0.0010711  80.343  < 2e-16 ***
## PC2         -0.0032319  0.0008663  -3.731 0.000196 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04717 on 1937 degrees of freedom
## Multiple R-squared:  0.007135,   Adjusted R-squared:  0.006622 
## F-statistic: 13.92 on 1 and 1937 DF,  p-value: 0.0001963
qqnorm(M11_PCA_Baltimore$resid)

hist(M11_PCA_Baltimore$resid)

### Baltimore Model 2

Too much, skew to the left.

Baltimore2$logspatialmismatch<- log(Baltimore2$spatialmismatch)

Baltimore2[is.na(Baltimore2)| Baltimore2 == "Inf"| Baltimore2 == "-Inf"] = NA

M12_PCA_Baltimore<- lm(logspatialmismatch ~ PC2, data= Baltimore2)

summary(M12_PCA_Baltimore)
## 
## Call:
## lm(formula = logspatialmismatch ~ PC2, data = Baltimore2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.7320 -0.3870  0.0392  0.4115  1.4981 
## 
## Coefficients:
##             Estimate Std. Error  t value Pr(>|t|)    
## (Intercept) -2.61274    0.01386 -188.492  < 2e-16 ***
## PC2         -0.06546    0.01121   -5.839 6.13e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6104 on 1937 degrees of freedom
## Multiple R-squared:  0.0173, Adjusted R-squared:  0.01679 
## F-statistic:  34.1 on 1 and 1937 DF,  p-value: 6.132e-09
hist(M12_PCA_Baltimore$resid)

###Baltimore Model 3

\[ \widehat{Spatial Mismatch} = ({-0.0006 \cdot PC2 + 0.282})^2 \]

This has an \[ R^{2}_{adj} = 0.01\] We used a square root transformation on spatial mismatch since the linearity model had skewness to the right and logarthmic transfomration was too much.

Furthermore, our current \[ R^{2}_{adj} =0.02\] has decreased to \[ R^{2}_{adj} = 0.01\]. but we are able to interpret this model with more simplicity. Despite the smaller increase our our predictors we have decieded to go with a simpler model because of the readability in the interaction between Principal Component 2 and Spatial Mismatch. Recall that Principal Component 2 main contributors were our original variables \(\textit{BachelorProp}\) , \(\textit{WhiteProp}\) ,and \(\textit{BlackProp}\). These variables contrasted each other. The variable \(\textit{BlackPropp}\) has a negative weight of \(-0.50\) which suggests that as the proportion of Black people than typical increase Principal Component 2 will decrease. Since Principal Component 2 has a negative weight in our overall model, we can say that that there are a higher proportion than average of people who are black. Additionally with $ = 0.46 $ and \(\textit{WhiteProp} =0.46\) as they proportions are higher than typical in a block group, Principal Component 2 increases.

This seems to suggest that eductaion and race are factors that play into spatial mismatch.

Baltimore2$sqrtspatialmismatch<- sqrt(Baltimore2$spatialmismatch)

Baltimore2[is.na(Baltimore2)| Baltimore2 == "Inf"| Baltimore2 == "-Inf"] = NA

M13_PCA_Baltimore<- lm(sqrtspatialmismatch ~ PC2, data= Baltimore2)

summary(M13_PCA_Baltimore)
## 
## Call:
## lm(formula = sqrtspatialmismatch ~ PC2, data = Baltimore2)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.253115 -0.059134 -0.007018  0.050727  0.287631 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.282593   0.001779 158.875  < 2e-16 ***
## PC2         -0.006802   0.001439  -4.728 2.43e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.07832 on 1937 degrees of freedom
## Multiple R-squared:  0.01141,    Adjusted R-squared:  0.0109 
## F-statistic: 22.36 on 1 and 1937 DF,  p-value: 2.427e-06
hist(M13_PCA_Baltimore$resid)

qqnorm(M13_PCA_Baltimore$resid)

car::qqPlot(M13_PCA_Baltimore$residuals)

## [1] 1706 1828
plot(M13_PCA_Baltimore$resid ~ M13_PCA_Baltimore$fitted)
abline(0,0)

### Analyze Baltimore Best Model 3

Observing the data, with out best model, we see that our curve doesn’t match the data. With our low \[ R^{2}_{adj} = 0.01\] we were not expecting a great model. This does suggest that the factors of Race and education ar enot good indicators in prediciting spatial mismatch in Baltimore as much as it is in Seattle.

plot(spatialmismatch ~ PC2, data=Baltimore2,
     xlab = "Principal Component 2", 
     ylab = "Spatial Mismatch")
curve((coef(M13_PCA_Baltimore)[2])^2*x^2+2*coef(M13_PCA_Baltimore)[1]*coef(M13_PCA_Baltimore)[2]*x+coef(M13_PCA_Baltimore)[1]^2*x^2, lwd = 2, add =T, col= "blue")

#Normalizing Data 

normalized_BaltimoreSpatial<- scale(Baltimore_spatial)

#Compute Correlation Matrix

BaltimoreSpatialcorr_matrix <- cor(normalized_BaltimoreSpatial)
ggcorrplot(BaltimoreSpatialcorr_matrix, colors = c("#d8b365", "#f5f5f5", "#5ab4ac"))

#Application 

PCA_BaltimoreSpatial <-princomp(BaltimoreSpatialcorr_matrix)
summary(PCA_BaltimoreSpatial)
## Importance of components:
##                           Comp.1    Comp.2     Comp.3     Comp.4     Comp.5
## Standard deviation     1.0418731 0.4370278 0.35106606 0.28679661 0.25999160
## Proportion of Variance 0.6632595 0.1167003 0.07530633 0.05025761 0.04130213
## Cumulative Proportion  0.6632595 0.7799598 0.85526618 0.90552379 0.94682592
##                            Comp.6     Comp.7      Comp.8       Comp.9
## Standard deviation     0.21996102 0.18602066 0.063552232 4.474720e-09
## Proportion of Variance 0.02956278 0.02114347 0.002467831 1.223448e-17
## Cumulative Proportion  0.97638870 0.99753217 1.000000000 1.000000e+00
fviz_pca_var(PCA_BaltimoreSpatial, col.var = "black")

PCA_BaltimoreSpatial$loadings[, 1:2]
##                      Comp.1      Comp.2
## hsdiplomaProp    0.30231085  0.43793235
## college1Prop     0.01234255  0.52334807
## somecollegeProp  0.17393041 -0.08761831
## assProp         -0.11608247  0.26342131
## bachelorProp    -0.44438150 -0.35230643
## GEDProp          0.27441782  0.22656530
## p12Prop          0.37641198  0.10080760
## WhiteProp       -0.47314656  0.37119579
## POCProp          0.47581003 -0.36586084
BaltimoreSpatialpcs<-as.matrix(normalized_BaltimoreSpatial %*% PCA_BaltimoreSpatial$loadings[, 1:2])

BaltimoreSpatialpc <- prcomp(Baltimore_finality3, center = TRUE, scale. = TRUE)

Baltimore2 <- as.data.frame(cbind(spatialmismatch=Baltimore_finality$spatialmismatch, BaltimoreSpatialpc$x[,1:2]))
# Baltimore Fitting Linear Model PCA


M2_PCA_BaltimoreSpatial <- lm(spatialmismatch ~ PC1 + PC2, data = Baltimore2)

M21_PCA_BaltimoreSpatial <-lm(spatialmismatch ~ PC2, data=Baltimore2)


summary(M2_PCA_BaltimoreSpatial)
## 
## Call:
## lm(formula = spatialmismatch ~ PC1 + PC2, data = Baltimore2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.09429 -0.03602 -0.01009  0.02535  0.23800 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.0860580  0.0010714  80.323  < 2e-16 ***
## PC1         -0.0001101  0.0006290  -0.175 0.861030    
## PC2         -0.0032319  0.0008665  -3.730 0.000197 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04718 on 1936 degrees of freedom
## Multiple R-squared:  0.007151,   Adjusted R-squared:  0.006125 
## F-statistic: 6.972 on 2 and 1936 DF,  p-value: 0.0009619
summary(M21_PCA_BaltimoreSpatial)
## 
## Call:
## lm(formula = spatialmismatch ~ PC2, data = Baltimore2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.09433 -0.03617 -0.01014  0.02542  0.23814 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.0860580  0.0010711  80.343  < 2e-16 ***
## PC2         -0.0032319  0.0008663  -3.731 0.000196 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.04717 on 1937 degrees of freedom
## Multiple R-squared:  0.007135,   Adjusted R-squared:  0.006622 
## F-statistic: 13.92 on 1 and 1937 DF,  p-value: 0.0001963

Williams Test:

library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
r.test(n = 2477, cor(Seattle_finality$spatialmismatch,Seattle_finality3$WhiteProp), cor(Baltimore_finality$spatialmismatch,Baltimore_finality$WhiteProp), n2 = 1939, twotailed =TRUE )
## Correlation tests 
## Call:r.test(n = 2477, r12 = cor(Seattle_finality$spatialmismatch, 
##     Seattle_finality3$WhiteProp), r34 = cor(Baltimore_finality$spatialmismatch, 
##     Baltimore_finality$WhiteProp), n2 = 1939, twotailed = TRUE)
## Test of difference between two independent correlations 
##  z value 5.66    with probability  0

###PCA analysis combined

  final<- finality %>%
    select(MSA,WhiteProp,AsianProp, HispanicProp, BlackProp, hsdiplomaProp,hsnodiplomaProp,somecollegeProp,college1Prop,assProp,bachelorProp)

final$MSA<-ifelse(final$MSA=="Seattle",1,0)

#Normalizing Data 

normalized_final<- scale(final)

#Compute Correlation Matrix

corr_matrix <- cor(normalized_final)
ggcorrplot(corr_matrix, colors = c("#d8b365", "#f5f5f5", "#5ab4ac"))

#Application 

PCA_final <-princomp(corr_matrix)
summary(PCA_final)
## Importance of components:
##                           Comp.1    Comp.2    Comp.3     Comp.4     Comp.5
## Standard deviation     0.8742480 0.5006109 0.4154802 0.30005179 0.25839304
## Proportion of Variance 0.5090512 0.1669140 0.1149722 0.05996317 0.04446863
## Cumulative Proportion  0.5090512 0.6759652 0.7909373 0.85090052 0.89536915
##                            Comp.6     Comp.7     Comp.8      Comp.9     Comp.10
## Standard deviation     0.23746437 0.22063155 0.18093071 0.119969327 0.070005131
## Proportion of Variance 0.03755684 0.03242107 0.02180302 0.009585894 0.003264013
## Cumulative Proportion  0.93292600 0.96534707 0.98715009 0.996735987 1.000000000
##                             Comp.11
## Standard deviation     5.607616e-09
## Proportion of Variance 2.094347e-17
## Cumulative Proportion  1.000000e+00
fviz_pca_var(PCA_final, col.var = "cos2", gradient.cols = c("black", "orange", "green"),repel = TRUE)

PCA_final$loadings[, 1:2]
##                      Comp.1      Comp.2
## MSA              0.31671690  0.08762000
## WhiteProp        0.38319929  0.48379311
## AsianProp        0.23619220 -0.42864290
## HispanicProp    -0.04036736 -0.05068313
## BlackProp       -0.47657111 -0.29800597
## hsdiplomaProp   -0.41376041  0.25462986
## hsnodiplomaProp -0.22724570 -0.01780631
## somecollegeProp -0.14228026  0.23303301
## college1Prop    -0.12447264  0.45288617
## assProp          0.09588531  0.33396094
## bachelorProp     0.44782030 -0.21693845
finalpcs<-as.matrix(normalized_final %*% PCA_final$loadings[, 1:2])
finalpc <- prcomp(final, center = TRUE, scale. = TRUE)

final2 <- as.data.frame(cbind(spatialmismatch=finality3$spatialmismatch, finalpc$x[,1:2]))

###Final regression

William’s Test

cor(final2$spatialmismatch,final2$PC1)
## [1] -0.158261
cor(final2$spatialmismatch,final2$PC2)
## [1] -0.1397548
r.test(n = 2477, cor(final2$spatialmismatch,final2$PC1),cor(final2$spatialmismatch,final2$PC2), n2 = 1939, twotailed =TRUE )
## Correlation tests 
## Call:r.test(n = 2477, r12 = cor(final2$spatialmismatch, final2$PC1), 
##     r34 = cor(final2$spatialmismatch, final2$PC2), n2 = 1939, 
##     twotailed = TRUE)
## Test of difference between two independent correlations 
##  z value 0.62    with probability  0.53

combine components and then find the correlations. spatial mismatch is related to different components and then try cities

combine different cities into one PCA and then run correlations based on PC.

LS0tCnRpdGxlOiAiTGFiIE5hbWUiCmF1dGhvcjogIkF1dGhvciBOYW1lIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KCnNldHdkKCJ+L0RvY3VtZW50cy9EYXRhIGFuZCBTb2NpZXR5L0RhdGEgYW5kIFNvY2lldHkiKQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZW9qc29uUikKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShnZ21hcCkKbGlicmFyeShzZikKbGlicmFyeSh3ZXNhbmRlcnNvbikKbGlicmFyeShjb3JycikKbGlicmFyeShnZ2NvcnJwbG90KQpsaWJyYXJ5KEZhY3RvTWluZVIpCmxpYnJhcnkoZmFjdG9leHRyYSkKCgpqb2JfYWNjZXNzX2dhcF9kaWN0IDwtIHJlYWRfY3N2KCJqb2JfYWNjZXNzX2dhcF9kaWN0LmNzdiIpCmpvYl9hY2Nlc3NfZ2FwXzJfIDwtIHJlYWRfY3N2KCJqb2JfYWNjZXNzX2dhcCAoMikuY3N2IikKam9iX2FjY2Vzc19nYXBfZXF1aXR5IDwtIHJlYWRfY3N2KCJqb2JfYWNjZXNzX2dhcF9lcXVpdHkuY3N2IikKam9iX2FjY2Vzc19nYXBfZXF1aXR5X2RpY3QgPC0gcmVhZF9jc3YoImpvYl9hY2Nlc3NfZ2FwX2VxdWl0eV9kaWN0LmNzdiIpCmpvYl9hY2Nlc3NfZ2VvanNvbiA8LSBGUk9NX0dlb0pzb24odXJsX2ZpbGVfc3RyaW5nID0gImh0dHBzOi8vdXJiYW4tZGF0YS1jYXRhbG9nLnMzLmFtYXpvbmF3cy5jb20vZHJ1cGFsLXJvb3QtbGl2ZS8yMDIxLzA0LzE1L2pvYl9hY2Nlc3NfZ2FwLmdlb2pzb24iKQp2YXJibG9ja3MyMDE4PC0gcmVhZF9jc3YoInZhcmJsb2NrczIwMTguY3N2IikKZmluYWxpdHkzIDwtIHJlYWRfY3N2KCJmaW5hbGl0eTMuY3N2IikKCmFjY2Vzc19qc29uIDwtIHJlYWRfc2YoImh0dHBzOi8vdXJiYW4tZGF0YS1jYXRhbG9nLnMzLmFtYXpvbmF3cy5jb20vZHJ1cGFsLXJvb3QtbGl2ZS8yMDIxLzA0LzE1L2pvYl9hY2Nlc3NfZ2FwLmdlb2pzb24iKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE1TQSA9PSAiU2VhdHRsZSIgfCBNU0EgPT0gIkJhbHRpbW9yZSIpICU+JQogIG11dGF0ZShHRU9JRCA9IGFzLmRvdWJsZShHRU9JRCkpCgpTcGF0aWFsIDwtIHJlYWRfY3N2KCJTcGF0aWFsLmNzdiIpCiAgCgoKYGBgCgojIyMgRXhlcmNpc2UgMQoKCgpgYGB7ciBjb2RlLWNodW5rLWxhYmVsLCBpbmNsdWRlPUZBTFNFfQoKam9iX2FjY2Vzc19nYXBfbmV3IDwtIGxlZnRfam9pbihqb2JfYWNjZXNzX2dhcF9lcXVpdHksIGpvYl9hY2Nlc3NfZ2FwXzJfLCBieT0gYygnY2JzYV9uYW1lJyA9ICdNU0EnKSkKCkFjY2Vzc19uZXc8LWpvYl9hY2Nlc3NfZ2FwX25ldyAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhwY3Rhc2lhbiwgcGN0YmxhY2ssIHBjdGhpc3BhbmljLHBjdHdoaXRlLCBwY3RvdGhlciwgcGN0bm9ud2hpdGUpLCBuYW1lc190byA9ICJyYWNlIiwgdmFsdWVzX3RvPSAidmFsdWUiKQoKam9iX2FjY2Vzc19nYXBfU2VhdHRsZTwtIGpvYl9hY2Nlc3NfZ2FwX25ldyAlPiUKICBmaWx0ZXIoY2JzYV9uYW1lID09ICJTZWF0dGxlIikgJT4lCiAgcmVsb2NhdGUoY2JzYV9uYW1lKSAlPiUKICBzZWxlY3QoY2JzYV9uYW1lLCBBY2Nlc3MzMFRyYW5zaXQsIE92ZXJhbGxKb2JBY2Nlc3MsIHBjdGFzaWFuLCBwY3RibGFjaywgcGN0aGlzcGFuaWMscGN0d2hpdGUscGN0b3RoZXIscGN0bm9ud2hpdGUsIHNwYXRpYWxtaXNtYXRjaCkKCgpib3hwbG90KEFjY2VzczMwVHJhbnNpdH5jYnNhX25hbWUsIGRhdGEgPSBqb2JfYWNjZXNzX2dhcF9uZXcpCgoKYm94cGxvdChPdmVyYWxsSm9iQWNjZXNzfmNic2FfbmFtZSwgZGF0YSA9IGpvYl9hY2Nlc3NfZ2FwX25ldykKCmJveHBsb3Qoc3BhdGlhbG1pc21hdGNoIH4gY2JzYV9uYW1lICwgZGF0YT1qb2JfYWNjZXNzX2dhcF9uZXcpCgoKYGBgCgoKYGBge3IgZWNobz1GQUxTRX0KCnJhY2VfZ3JvdXBlZFNlYXR0bGU8LWpvYl9hY2Nlc3NfZ2FwX2VxdWl0eSAlPiUKICBzZWxlY3QodHlwZSwgcGN0YXNpYW4scGN0YmxhY2sscGN0aGlzcGFuaWMscGN0d2hpdGUsY2JzYV9uYW1lKSAlPiUKICBmaWx0ZXIoY2JzYV9uYW1lID09ICJTZWF0dGxlIiApICU+JQogIHBpdm90X2xvbmdlcihjKHBjdGFzaWFuLHBjdGhpc3BhbmljLCBwY3RibGFjayxwY3R3aGl0ZSksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlJhY2UiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZXMiKQoKcmFjZV9ncm91cGVkQmFsdGltb3JlPC1qb2JfYWNjZXNzX2dhcF9lcXVpdHkgJT4lCiAgc2VsZWN0KHR5cGUsIHBjdGFzaWFuLHBjdGJsYWNrLHBjdGhpc3BhbmljLHBjdHdoaXRlLGNic2FfbmFtZSkgJT4lCiAgZmlsdGVyKGNic2FfbmFtZSA9PSAiQmFsdGltb3JlIiApICU+JQogIHBpdm90X2xvbmdlcihjKHBjdGFzaWFuLHBjdGhpc3BhbmljLCBwY3RibGFjayxwY3R3aGl0ZSksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlJhY2UiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZXMiKQogIAogIAoKICAKICAKICByYWNlX2dyb3VwZWRTZWF0dGxlJT4lCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeD1SYWNlLCB5PSBQZXJjZW50YWdlcyAsIGZpbGwgPSB0eXBlKSkgKwogIGdlb21fYmFyKCBwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiLCApICsKICBsYWJzKHRpdGxlID0gIkNvbXBhcmluZyBTcGF0aWFsIE1pc21hdGNoIGluIFNlYXR0bGUiLAogICAgICAgc3VidGl0bGUgPSAiR2VuZXJhbCB2ZXJzdXMgV29yc3QgR3JvdXBlZCBieSBSYWNlIiwKICAgICAgIHggPSAiUmFjaWFsIEdyb3VwcyIsCiAgICAgICB5PSAiUGVyY2VudGFnZXMiKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj00LCBuYW1lPSJHcmFuZEJ1ZGFwZXN0MiIpKSsKICAgIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGMoInBjdHdoaXRlIiwgInBjdGFzaWFuIiwgInBjdGhpc3BhbmljIiwgInBjdGJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJXaGl0ZSIsICJBc2lhbiIsIkhpc3BhbmljIiwgIkJsYWNrIikKICAgICAgICAgICAgICAgICAgICAKICAgICkKCiAgCiAgcmFjZV9ncm91cGVkQmFsdGltb3JlJT4lCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeD1SYWNlLCB5PSBQZXJjZW50YWdlcyAsIGZpbGwgPSB0eXBlKSkgKwogIGdlb21fYmFyKCBwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiLCApICsKICBsYWJzKHRpdGxlID0gIkNvbXBhcmluZyBTcGF0aWFsIE1pc21hdGNoIGluIEJhbHRpbW9yZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJHZW5lcmFsIHZlcnN1cyBXb3JzdCBHcm91cGVkIGJ5IFJhY2UiLAogICAgICAgeCA9ICJSYWNpYWwgR3JvdXBzIiwKICAgICAgIHk9ICJQZXJjZW50YWdlcyIpKwogICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj00LCBuYW1lPSJHcmFuZEJ1ZGFwZXN0MiIpKSsKICAgICAgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gYygicGN0d2hpdGUiLCAicGN0YmxhY2siLCAicGN0aGlzcGFuaWMiLCAicGN0YXNpYW4iKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIldoaXRlIiwgIkJsYWNrIiwiSGlzcGFuaWMiLCAiQXNpYW4iKQogICAgICAgICAgICAgICAgICAgIAogICAgKQpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFfQoKClBPQ3doaXRlX2VxdWl0eVNlYXR0bGU8LWpvYl9hY2Nlc3NfZ2FwX2VxdWl0eSAlPiUKICBzZWxlY3QodHlwZSxwY3R3aGl0ZSwgcGN0bm9ud2hpdGUsIGNic2FfbmFtZSkgJT4lCiAgZmlsdGVyKGNic2FfbmFtZSA9PSAiU2VhdHRsZSIgKSAlPiUKICBwaXZvdF9sb25nZXIoYyhwY3R3aGl0ZSxwY3Rub253aGl0ZSksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIlJhY2UiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZXMiKQoKClBPQ3doaXRlX2VxdWl0eVNlYXR0bGUlPiUKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4PVJhY2UsIHk9IFBlcmNlbnRhZ2VzICwgZmlsbCA9IHR5cGUpKSArCiAgZ2VvbV9iYXIoIHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJpZGVudGl0eSIsICkgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyaW5nIFNwYXRpYWwgTWlzbWF0Y2ggaW4gU2VhdHRsZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJHZW5lcmFsIHZlcnN1cyBXb3JzdCBHcm91cGVkIGJ5IFJhY2UiLAogICAgICAgeCA9ICJSYWNpYWwgR3JvdXBzIiwKICAgICAgIHk9ICJQZXJjZW50YWdlcyIpICsKICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49NCwgbmFtZT0iR3JhbmRCdWRhcGVzdDIiKSkrCiAgICBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjKCJwY3R3aGl0ZSIsICJwY3Rub253aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiV2hpdGUiLCAiUGVvcGxlIG9mIENvbG9yIikKICAgICAgICAgICAgICAgICAgICAKICAgICkKCgoKClBPQ3doaXRlX2VxdWl0eUJhbHRpbW9yZTwtam9iX2FjY2Vzc19nYXBfZXF1aXR5ICU+JQogIHNlbGVjdCh0eXBlLHBjdHdoaXRlLCBwY3Rub253aGl0ZSwgY2JzYV9uYW1lKSAlPiUKICBmaWx0ZXIoY2JzYV9uYW1lID09ICJCYWx0aW1vcmUiICkgJT4lCiAgcGl2b3RfbG9uZ2VyKGMocGN0d2hpdGUscGN0bm9ud2hpdGUpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJSYWNlIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2VzIikKCgpQT0N3aGl0ZV9lcXVpdHlCYWx0aW1vcmUlPiUKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4PVJhY2UsIHk9IFBlcmNlbnRhZ2VzICwgZmlsbCA9IHR5cGUpKSArCiAgZ2VvbV9iYXIoIHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJpZGVudGl0eSIsICkgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyaW5nIFNwYXRpYWwgTWlzbWF0Y2ggaW4gQmFsdGltb3JlIiwKICAgICAgIHN1YnRpdGxlID0gIkdlbmVyYWwgdmVyc3VzIFdvcnN0IEdyb3VwZWQgYnkgUmFjZSIsCiAgICAgICB4ID0gIlJhY2lhbCBHcm91cHMiLAogICAgICAgeT0gIlBlcmNlbnRhZ2VzIikgKwogICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj00LCBuYW1lPSJHcmFuZEJ1ZGFwZXN0MiIpKSsKICAgIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGMoInBjdG5vbndoaXRlIiwgInBjdHdoaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQZW9wbGUgb2YgQ29sb3IiLCAiV2hpdGUiKQogICAgKQogICAgICAgICAgICAgICAgICAgIAoKCmBgYAoKCiMjIyBFeGVyY2lzZSAyCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKCmZpbmFsaXR5PC1maW5hbGl0eTMgJT4lCiBzZWxlY3QoR0VPSUQsIHNwYXRpYWxtaXNtYXRjaCwgTVNBLCBnZW9tZXRyeSwgV2hpdGVQcm9wLCBCbGFja1Byb3AsIEFzaWFuUHJvcCwgSGlzcGFuaWNQcm9wLGhzZGlwbG9tYVByb3AsIGhzbm9kaXBsb21hUHJvcCwgY29sbGVnZTFQcm9wLCBzb21lY29sbGVnZVByb3AsIGFzc1Byb3AsIGJhY2hlbG9yUHJvcCApIAoKClNlYXR0bGVfZmluYWxpdHk8LSBmaW5hbGl0eSAlPiUKICBmaWx0ZXIoTVNBID09ICJTZWF0dGxlIikKCkJhbHRpbW9yZV9maW5hbGl0eTwtIGZpbmFsaXR5ICU+JQogIGZpbHRlcihNU0EgPT0gIkJhbHRpbW9yZSIpCgpTcGF0aWFsIDwtIFNwYXRpYWwgJT4lCiAgc2VsZWN0KE1TQSxoc2RpcGxvbWFQcm9wLCBjb2xsZWdlMVByb3AsIHNvbWVjb2xsZWdlUHJvcCwgYXNzUHJvcCwgYmFjaGVsb3JQcm9wLCBHRURQcm9wLCBwMTJQcm9wLCBXaGl0ZVByb3AsIFBPQ1Byb3ApIAoKU2VhdHRsZV9zcGF0aWFsIDwtIFNwYXRpYWwgJT4lCiAgZmlsdGVyKE1TQSA9PSAiU2VhdHRsZSIpICU+JQogIHNlbGVjdCgtTVNBKQogIAoKQmFsdGltb3JlX3NwYXRpYWwgPC0gU3BhdGlhbCAlPiUKICBmaWx0ZXIoTVNBID09ICJCYWx0aW1vcmUiKSU+JQogIHNlbGVjdCgtTVNBKQogIAoKCgoKCgpgYGAKCgoKCgojIyMgT3ZlcmFsbCAKCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKY29yLnRlc3QoZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBmaW5hbGl0eSRXaGl0ZVByb3ApCgpvdmVyYWxsbTE8LWxtKHNwYXRpYWxtaXNtYXRjaH5XaGl0ZVByb3AsIGRhdGE9IGZpbmFsaXR5KQoKc3VtbWFyeShvdmVyYWxsbTEpCgpgYGAKCiMjIyBTZWF0dGxlIAoKT2JzZXJ2aW5nIGhvdyByYWNlcHJvcG9ydGlvbiBzaWduaWZpY2FuY2Ugb24gc3BhdGlhbCBtaXNtYXRjaCB3aXRoIGNvcnJlbGF0aW9uIHRlc3RpbmcuIAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KCmNvci50ZXN0KFNlYXR0bGVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBTZWF0dGxlX2ZpbmFsaXR5JFdoaXRlUHJvcCkKY29yLnRlc3QoU2VhdHRsZV9maW5hbGl0eSRzcGF0aWFsbWlzbWF0Y2gsIFNlYXR0bGVfZmluYWxpdHkkQmxhY2tQcm9wKQpjb3IudGVzdChTZWF0dGxlX2ZpbmFsaXR5JHNwYXRpYWxtaXNtYXRjaCwgU2VhdHRsZV9maW5hbGl0eSRBc2lhblByb3ApCmNvci50ZXN0KFNlYXR0bGVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBTZWF0dGxlX2ZpbmFsaXR5JEhpc3BhbmljUHJvcCkKCgpTZWF0dGxlX3JhY2VhbGw8LSBsbShzcGF0aWFsbWlzbWF0Y2h+IFdoaXRlUHJvcCArQmxhY2tQcm9wICtBc2lhblByb3AgK0hpc3BhbmljUHJvcCwgZGF0YSA9IFNlYXR0bGVfZmluYWxpdHkpCnN1bW1hcnkoU2VhdHRsZV9yYWNlYWxsKQoKU2VhdHRsZV9yYWNlc29tZSA8LSBsbShzcGF0aWFsbWlzbWF0Y2h+V2hpdGVQcm9wK0FzaWFuUHJvcCwgZGF0YSA9IFNlYXR0bGVfZmluYWxpdHkpCnN1bW1hcnkoU2VhdHRsZV9yYWNlc29tZSkKCgpgYGAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cgpjb3IudGVzdChTZWF0dGxlX2ZpbmFsaXR5JHNwYXRpYWxtaXNtYXRjaCwgU2VhdHRsZV9maW5hbGl0eSRoc2RpcGxvbWFQcm9wKQpjb3IudGVzdChTZWF0dGxlX2ZpbmFsaXR5JHNwYXRpYWxtaXNtYXRjaCwgU2VhdHRsZV9maW5hbGl0eSRoc25vZGlwbG9tYVByb3ApCmNvci50ZXN0KFNlYXR0bGVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBTZWF0dGxlX2ZpbmFsaXR5JGNvbGxlZ2UxUHJvcCkKY29yLnRlc3QoU2VhdHRsZV9maW5hbGl0eSRzcGF0aWFsbWlzbWF0Y2gsIFNlYXR0bGVfZmluYWxpdHkkc29tZWNvbGxlZ2VQcm9wKQpjb3IudGVzdChTZWF0dGxlX2ZpbmFsaXR5JHNwYXRpYWxtaXNtYXRjaCwgU2VhdHRsZV9maW5hbGl0eSRhc3NQcm9wKQpjb3IudGVzdChTZWF0dGxlX2ZpbmFsaXR5JHNwYXRpYWxtaXNtYXRjaCwgU2VhdHRsZV9maW5hbGl0eSRiYWNoZWxvclByb3ApCgoKU2VhdHRsZV9lZGFsbDwtIGxtKHNwYXRpYWxtaXNtYXRjaH4gaHNkaXBsb21hUHJvcCArIGhzbm9kaXBsb21hUHJvcCArIGNvbGxlZ2UxUHJvcCArIHNvbWVjb2xsZWdlUHJvcCArIGFzc1Byb3ArIGJhY2hlbG9yUHJvcCwgZGF0YSA9IFNlYXR0bGVfZmluYWxpdHkpCnN1bW1hcnkoU2VhdHRsZV9lZGFsbCkKClNlYXR0bGVfZWRzb21lPC0gbG0oc3BhdGlhbG1pc21hdGNofiBoc2RpcGxvbWFQcm9wICsgY29sbGVnZTFQcm9wICsgYmFjaGVsb3JQcm9wLCBkYXRhID0gU2VhdHRsZV9maW5hbGl0eSkKc3VtbWFyeShTZWF0dGxlX2Vkc29tZSkKClNlYXR0bGVfZWRyZWZpbmVkPC0gbG0oc3BhdGlhbG1pc21hdGNoIH4gY29sbGVnZTFQcm9wICtiYWNoZWxvclByb3AsIGRhdGEgPSBTZWF0dGxlX2ZpbmFsaXR5KQoKCgoKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKClNlYXR0bGVfYWxsIDwtIGxtKHNwYXRpYWxtaXNtYXRjaCB+IFdoaXRlUHJvcCArIEJsYWNrUHJvcCArQXNpYW5Qcm9wICsgSGlzcGFuaWNQcm9wICsgaHNkaXBsb21hUHJvcCArIGhzbm9kaXBsb21hUHJvcCArIGNvbGxlZ2UxUHJvcCArIHNvbWVjb2xsZWdlUHJvcCArIGFzc1Byb3ArIGJhY2hlbG9yUHJvcCwgZGF0YSA9IFNlYXR0bGVfZmluYWxpdHkpCgpzdGVwLm1vZGVsIDwtIE1BU1M6OnN0ZXBBSUMoU2VhdHRsZV9hbGwsIGRpcmVjdGlvbiA9ICJib3RoIiwgCiAgICAgICAgICAgICAgICAgICAgICB0cmFjZSA9IEZBTFNFKQpzdW1tYXJ5KHN0ZXAubW9kZWwpCmBgYAoKCgojIyMgQmFsdGltb3JlCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpjb3IudGVzdChCYWx0aW1vcmVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBCYWx0aW1vcmVfZmluYWxpdHkkV2hpdGVQcm9wKQpjb3IudGVzdChCYWx0aW1vcmVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBCYWx0aW1vcmVfZmluYWxpdHkkQmxhY2tQcm9wKQpjb3IudGVzdChCYWx0aW1vcmVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBCYWx0aW1vcmVfZmluYWxpdHkkQXNpYW5Qcm9wKQpjb3IudGVzdChCYWx0aW1vcmVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBCYWx0aW1vcmVfZmluYWxpdHkkSGlzcGFuaWNQcm9wKQoKCkJhbHRpbW9yZV9yYWNlYWxsPC0gbG0oc3BhdGlhbG1pc21hdGNofiBXaGl0ZVByb3AgK0JsYWNrUHJvcCArQXNpYW5Qcm9wICtIaXNwYW5pY1Byb3AsIGRhdGEgPSBCYWx0aW1vcmVfZmluYWxpdHkpCnN1bW1hcnkoQmFsdGltb3JlX3JhY2VhbGwpCgpCYWx0aW1vcmVfcmFjZXNvbWUgPC0gbG0oc3BhdGlhbG1pc21hdGNofkJsYWNrUHJvcCArIEFzaWFuUHJvcCArIEhpc3BhbmljUHJvcCwgZGF0YSA9IEJhbHRpbW9yZV9maW5hbGl0eSkKc3VtbWFyeShCYWx0aW1vcmVfcmFjZXNvbWUpCgpCYWx0aW1vcmVfcmFjZXdiPC0gbG0oc3BhdGlhbG1pc21hdGNofiBXaGl0ZVByb3AgKyBCbGFja1Byb3AsIGRhdGEgPSBCYWx0aW1vcmVfZmluYWxpdHkpCnN1bW1hcnkoQmFsdGltb3JlX3JhY2V3YikKCgoKYGBgCgoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KQmFsdGltb3JlX2FsbCA8LSBsbShzcGF0aWFsbWlzbWF0Y2ggfiBXaGl0ZVByb3AgKyBCbGFja1Byb3AgK0FzaWFuUHJvcCArIEhpc3BhbmljUHJvcCArIGhzZGlwbG9tYVByb3AgKyBoc25vZGlwbG9tYVByb3AgKyBjb2xsZWdlMVByb3AgKyBzb21lY29sbGVnZVByb3AgKyBhc3NQcm9wKyBiYWNoZWxvclByb3AsIGRhdGEgPSBCYWx0aW1vcmVfZmluYWxpdHkpCgpCYWx0aW1vcmVfYWxsbW9kZWwgPC0gTUFTUzo6c3RlcEFJQyhTZWF0dGxlX2FsbCwgZGlyZWN0aW9uID0gImJvdGgiLCAKICAgICAgICAgICAgICAgICAgICAgIHRyYWNlID0gRkFMU0UpCnN1bW1hcnkoQmFsdGltb3JlX2FsbCkKCmBgYAoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmNlbnN1c19hY2Nlc3MgPC0gbGVmdF9qb2luKGFjY2Vzc19qc29uLCBmaW5hbGl0eTMsIGJ5ID0gIkdFT0lEIikKCgpzcGFjZSA8LSBjb2xvckJpbigKICBwYWxldHRlID0gIlJkWWxCdSIsCiAgZG9tYWluID0gY2Vuc3VzX2FjY2VzcyRzcGF0aWFsbWlzbWF0Y2gueCkKYGBgCgoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CgpjdXRwb2ludHMgPSBjKDAsIDAuMDUsIDAuMTAsIDAuMTUsMC4yMCwgMC4zMCwgMC41MCwwLjcwLDEuMDApCgpsYWJlbHM9IGMoIjAtMC4wNSIsICIwLjA2LTAuMTAiLCAiMC4xMS0wLjE1IiwgIjAuMTYtMC4zMCIsICIwLjMxLTAuNTAiLCAiMC41MS0wLjcwIiwiMC43MS0xLjAwIikKCm15X2NvbG9ycyA8LSBjKCIjZmZmZmQ0IiwgIiNmZWUzOTEiLCAiI2ZlYzQ0ZiIsICIjZmU5OTI5IiwgIiNlYzcwMTQiLCAiI2NjNGMwMiIgLCAiIzhjMmQwNCIpCgoKCmRlZ3JlZSA8LSBjb2xvckJpbihwYWxldHRlID0gbXlfY29sb3JzLCBkb21haW4gPSBjZW5zdXNfYWNjZXNzJGJhY2hlbG9yUHJvcCwgYmlucyA9IGN1dHBvaW50cykKCmNlbnN1c19hY2Nlc3MgJT4lCiAgZHBseXI6OmZpbHRlcihNU0EueSA9PSAiU2VhdHRsZSIpICU+JQogIHNmOjpzdF90cmFuc2Zvcm0oJytwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0JykgJT4lCiAgbGVhZmxldCgpICU+JQogIGFkZFRpbGVzKCkgJT4lCiAgYWRkUG9seWdvbnMoY29sb3IgPSAiIzQ0NDQ0NCIsIAogICAgICAgICAgICAgIHdlaWdodCA9IDAuNSwKICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjUsIAogICAgICAgICAgICAgIGZpbGxDb2xvcj1+ZGVncmVlKHJvdW5kKGNlbnN1c19hY2Nlc3MkYmFjaGVsb3JQcm9wLDMpKSwgCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjgsIAogICAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gIndoaXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwgCiAgICAgICAgICAgICAgbGFiZWwgPSByb3VuZChjZW5zdXNfYWNjZXNzJGJhY2hlbG9yUHJvcCwgMyksIAogICAgICAgICAgICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucygKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IGxpc3QoImZvbnQtd2VpZ2h0IiA9ICJub3JtYWwiLCBwYWRkaW5nID0gIjNweCA4cHgiKSwKICAgICAgICAgICAgICAgICAgdGV4dHNpemUgPSAiMTVweCIsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiYXV0byIpKSAlPiUKICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwKICAgICAgICAgICAgcGFsID0gZGVncmVlLCAKICAgICAgICAgICAgdmFsdWVzID0gY2Vuc3VzX2FjY2VzcyRiYWNoZWxvcnByb3AsCiAgICAgICAgICAgIHRpdGxlID0gIkJhY2hlbG9yUHJvcCIsCiAgICAgICAgICAgICBvcGFjaXR5ID0gMQogICkKCgpgYGAKCiMjIyBQQ0EKCiMjIFNlYXR0bGUgCgoKCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KClNlYXR0bGVfZmluYWxpdHkzIDwtIFNlYXR0bGVfZmluYWxpdHkgJT4lCiAgc2VsZWN0KFdoaXRlUHJvcCxBc2lhblByb3AsIEhpc3BhbmljUHJvcCwgQmxhY2tQcm9wLCBoc2RpcGxvbWFQcm9wLGhzbm9kaXBsb21hUHJvcCxzb21lY29sbGVnZVByb3AsY29sbGVnZTFQcm9wLGFzc1Byb3AsYmFjaGVsb3JQcm9wKQoKCiNOb3JtYWxpemluZyBEYXRhIAoKbm9ybWFsaXplZF9TZWF0dGxlPC0gc2NhbGUoU2VhdHRsZV9maW5hbGl0eTMpCgojQ29tcHV0ZSBDb3JyZWxhdGlvbiBNYXRyaXgKClNlYXR0bGVjb3JyX21hdHJpeCA8LSBjb3Iobm9ybWFsaXplZF9TZWF0dGxlKQpnZ2NvcnJwbG90KFNlYXR0bGVjb3JyX21hdHJpeCwgY29sb3JzID0gYygiI2Q4YjM2NSIsICIjZjVmNWY1IiwgIiM1YWI0YWMiKSkKCiNBcHBsaWNhdGlvbiAKClBDQV9TZWF0dGxlIDwtcHJpbmNvbXAoU2VhdHRsZWNvcnJfbWF0cml4KQpzdW1tYXJ5KFBDQV9TZWF0dGxlKQoKZnZpel9wY2FfdmFyKFBDQV9TZWF0dGxlLCBjb2wudmFyID0gImJsYWNrIikKClBDQV9TZWF0dGxlJGxvYWRpbmdzWywgMToyXQoKU2VhdHRsZXBjczwtYXMubWF0cml4KG5vcm1hbGl6ZWRfU2VhdHRsZSAlKiUgUENBX1NlYXR0bGUkbG9hZGluZ3NbLCAxOjJdKQpTZWF0dGxlcGMgPC0gcHJjb21wKFNlYXR0bGVfZmluYWxpdHkzLCBjZW50ZXIgPSBUUlVFLCBzY2FsZS4gPSBUUlVFKQoKU2VhdHRsZTIgPC0gYXMuZGF0YS5mcmFtZShjYmluZChzcGF0aWFsbWlzbWF0Y2g9U2VhdHRsZV9maW5hbGl0eSRzcGF0aWFsbWlzbWF0Y2gsIFNlYXR0bGVwYyR4WywxOjJdKSkKCgoKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKI1NlYXR0bGUgTGluZWFyIFJlZ3Jlc3Npb24gd2l0aCBQQ0EKCk0xX1BDQV9TZWF0dGxlIDwtIGxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSArIFBDMiwgZGF0YSA9IFNlYXR0bGUyKQoKTTExX1BDQV9TZWF0dGxlIDwtbG0oc3BhdGlhbG1pc21hdGNoIH4gUEMxLCBkYXRhPVNlYXR0bGUyKQoKCnN1bW1hcnkoTTFfUENBX1NlYXR0bGUpCnN1bW1hcnkoTTExX1BDQV9TZWF0dGxlKQoKYGBgCgojI1NlYXR0bGUgTW9kZWwgMgoKJCQgXHdpZGVoYXR7U3BhdGlhbCBNaXNtYXRjaH0gPSBlXnstMC4xMjI5NDYgXGNkb3QgUEMxICAtMi42NjMzMDJ9ICQkCgpUaGlzIGhhcyBhbiAkJCBSXnsyfV97YWRqfSA9IDAuMTYkJCBXZSB1c2VkIGEgbG9nYXJ0aG1pYyB0cmFuc2Zvcm1hdGlvbiBvbiAKc3BhdGlhbCBtaXNtYXRjaCBzaW5jZSB0aGUgbGluZWFyaXR5IG1vZGVsIGhhZCBza2V3bmVzcyB0byB0aGUgcmlnaHQuIEFkZGl0aW9uYWxseSwKdGhlIG5vcm1hbGl0eSBwcm9iYWJpbGl0eSBwbG90IHN1Z2dlc3RzIGEgc2xpZ2h0IHVwd2FyZCB0cmVuZCByZW1pbnNpY2llbnQgb2YgYSAKbG9nL3BvbHlub21pYWwgdHJhbnNmb3JtYXRpb24uIAoKRnVydGhlcm1vcmUsCm91ciBjdXJyZW50ICQkIFJeezJ9X3thZGp9ICQkICBoYXMgaW5jcmVhc2VkIGZyb20gJCQgUl57Mn1fe2Fkan0gPSAwLjEzJCQuIApEZXNwaXRlIHRoZSBzbWFsbGVyIGluY3JlYXNlIG91ciBvdXIgcHJlZGljdG9ycyB3ZSBoYXZlIGRlY2llZGVkIHRvIGdvIHdpdGggCmEgc2ltcGxlciBtb2RlbCBiZWNhdXNlIG9mIHRoZSByZWFkaWJpbGl0eSBpbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBQcmluY2lwYWwgCkNvbXBvbmVudCAxIGFuZCBTcGF0aWFsIE1pc21hdGNoLiBSZWNhbGwgdGhhdCBQcmluY2lwYWwgQ29tcG9uZW50IDEgbWFpbiBjb250cmlidXRvcnMgd2VyZSBvdXIgb3JpZ2luYWwgdmFyaWFibGVzICRcdGV4dGl0e0JhY2hlbG9yUHJvcH0kIGFuZCAkXHRleHRpdHtoc2RpcGxvbWFQcm9wfSQuIFRoZXNlIHZhcmlhYmxlcyBjb250cmFzdGVkIGVhY2ggb3RoZXIuIFRoZSB2YXJpYWJsZSAkXHRleHRpdHtoc2RpcGxvbWFQcm9wfSQgaGFzIGEgbmVnYXRpdmUgd2VpZ2h0IG9mICQtMC40MyQgd2hpY2ggc3VnZ2VzdHMgdGhhdCBhcyB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgd2hvIGhhdmUgYSBoaWdoIHNjaG9vbCBkaXBsb21hIHRoYW4gdHlwaWNhbCBpbmNyZWFzZSBQcmluY2lwYWwgQ29tcG9uZW50IDEgd2lsbCBkZWNyZWFzZS4gU2luY2UgUHJpbmNwYWwgQ29tcG9uZW50IDEgaGFzIGEgbmVnYXRpdmUgd2VpZ2h0IGluIG91ciBvdmVyYWxsIG1vZGVsLCB3ZSBjYW4gc2F5IHRoYXQgdGhhdCB0aGVyZSBhcmUgYSBoaWdoZXIgCnByb3BvcnRpb24gdGhhbiBhdmVyYWdlIG9mIHBlb3BsZSB3aG8gaGF2ZSBhIGhpZ2ggc2Nob29sIGRpcGxvbWEuIAoKCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnFxbm9ybShNMTFfUENBX1NlYXR0bGUkcmVzaWQpCnFxbGluZShNMTFfUENBX1NlYXR0bGUkZml0dGVkKQogaGlzdChyZXNpZChNMTFfUENBX1NlYXR0bGUpKQoKcGxvdChNMTFfUENBX1NlYXR0bGUkcmVzaWQtIE0xMV9QQ0FfU2VhdHRsZSRmaXR0ZWQpCmFibGluZSgwLDApCgpTZWF0dGxlMiRsb2dzcGF0aWFsbWlzbWF0Y2g8LWxvZyhTZWF0dGxlMiRzcGF0aWFsbWlzbWF0Y2gpClNlYXR0bGUyJGxvZ1BDMSA8LSBsb2coU2VhdHRsZTIkUEMxKQoKU2VhdHRsZTJbaXMubmEoU2VhdHRsZTIpfCBTZWF0dGxlMiA9PSAiSW5mInwgU2VhdHRsZTIgPT0gIi1JbmYiXSA9IE5BCgoKCk0xMl9QQ0FfU2VhdHRsZSA8LWxtKGxvZ3NwYXRpYWxtaXNtYXRjaCB+IFBDMSwgZGF0YT1TZWF0dGxlMikKc3VtbWFyeShNMTJfUENBX1NlYXR0bGUpCgpxcW5vcm0oTTEyX1BDQV9TZWF0dGxlJHJlc2lkKQpoaXN0KE0xMl9QQ0FfU2VhdHRsZSRyZXNpZCkKCk0xM19QQ0FfU2VhdHRsZSA8LSBsbShsb2dzcGF0aWFsbWlzbWF0Y2ggfmxvZ1BDMSwgZGF0YT1TZWF0dGxlMikKc3VtbWFyeShNMTNfUENBX1NlYXR0bGUpICNEb24ndCB1c2UgdGhpcyBtb2RlbCwgbG9nUENJIGhhcyBsZXNzIHZhbHVlcy4gCgpjYXI6OnFxUGxvdChNMTJfUENBX1NlYXR0bGUpCgoKYGBgCgpBbmFseXNpcyBTZWF0dGxlIEJlc3QgTW9kZWw6IAoKSnVzdCBhcyBhIHJlbWluZGVyIFByaW5jaXBhbCBDb21wb25lbnQgMSBmb3IgU2VhdHRsZSBoZWF2aWVzdCB3ZWlnaHRzIGNvbnNpc3Qgb2YgdGhlIAp2YXJpYWJsZXMgJFx0ZXh0aXR7aHNkaXBsb21hUHJvcH0kIHdoaWNoIGlzIHRoZSBwcm9wb3J0aW9uIG9mIGxvdy1pbmNvbWUKcGVvcGxlIGluIGJsb2NrIGdyb3VwcyB0aGF0IGhhdmUgYXR0YWluZWQgYSBoaWdoIHNjaG9vbCBlZHVjYXRpb24gYW5kICRcdGV4dGl0e2JhY2hlbG9yUHJvcH0kIHdoaWNoIGlzIHRoZSAKcHJvcG9ydGlvbiBvZiBsb3ctaW5jb21lIHBlb3BsZSBpbiBibG9jayBncm91cHMgdGhhdCBoYXZlIGF0dGFpbmVkIGEgYmFjaGVsb3JzLiAKCldlIHNlZSB0aGUgcHJvcG9ydGlvbiBvZiBsb3ctaW5jb21lIHBlb3BsZSB3aG8gaGF2ZSBhdHRhaW5lZCAKdGhlaXIgaGlnaCBzY2hvb2wgZGlwbG9tYSBpbiBibG9jayBncm91cHMgaXMgaGlnaGVyIHRoYW4gYXZlcmFnZSwgdGhlIGhpZ2hlciB0aGUKc3BhdGlhbCBtaXNtYXRjaCBpcy4gRXNwZWNpYWxseSBsb29raW5nIGF0IHRoZSBncmFwaCB3aGVuIHRoZSBQcmluY2lwYWwgY29tcG9uZW50IApPbmUgaXMgYmV0d2VlbiAtMiBhbmQgMCwgc3BhdGlhbCBtaXNtYXRjaCB0ZW5kcyB0byBpbmNyZWFzZS4gCgpUaGVuIGFzIHdlIHNlZSB0aGUgcHJvcG9ydGlvbiBvZiBsb3ctaW5jb21lIHBlb3BsZSB3aG8gaGF2ZSBhdHRhaW5lZCB0aGVpciBiYWNlbG9yJ3MgCmluIGJsb2NrIGdyb3VwcyBpcyBoaWdoZXIgdGhhbiBhdmVyYWdlLCB0aGUgbG93ZXIgdGhlIHNwYXRpYWwgbWlzbWF0Y2ggaXMuIFdlIApzZWUgdGhhdCBhcyBnZXQgY2xvc2VyIHRvIDQsIHRoZSBzcGF0aWFsIG1pc21hdGNoIGlzIGNsb3NlIHRvIDAuIAoKU29tZXRoaW5nIGludGVyZXN0aW5nIHRvIG5vdGUsIGlzIHRoYXQgYW1vbmdzdCBwcmluY2lwYWwgY29tcG9uZW50IDEsIGlzIHRoYXQgdGhlIHZhcmlhYmxlICRcdGV4dGl0e0hpc3BhbmljclByb3B9JCwgJFx0ZXh0aXR7QmxhY2tQcm9wfSQgYW5kICRcdGV4dGl0e1doaXRlUHJvcH0kCmFyZSBhbGwgcmVsYXRpdmVseSBoaWdoIGFzIHdlbGwuIFdpdGggJFx0ZXh0aXR7SGlzcGFuaWNyUHJvcH0gPSAtMC4zNyAkLCAkXHRleHRpdHtCbGFja1Byb3B9ID0gIC0wLjI5JCAgYW5kICRcdGV4dGl0e1doaXRlUHJvcH0gPSAwLjI5JC4gSW4gdGhpcyBjYXNlLCAKd2UgYWxzbyBzZWUgdGhhdCBhcyBIaXNwYW5pYyBwcm9wb3J0aW9ucyBhcmUgaGlnaGVyIHRoYW4gYXZlcmFnZSBpbiBibG9jayBncm91cHMsIApwcmluY2lwYWwgY29tcG9uZW50IDEgd2lsbCBkZWNyZWFzZS4gU2ltaWxhcmx5LCBhcyBCbGFjayBwcm9wb3J0aW9ucyBhcmUgaGlnaGVyIAp0aGFuIGF2ZXJhZ2UgaW4gYmxvY2sgZ3JvdXBzIHByaW5jaXBhbCBjb21wb25lbnQgMSB3aWxsIGFsc28gZGVjcmVhc2UuIENvbnZlcnNsZWx5CmFzIHdoaXRlIHByb3BvcnRpb25zIGFyZSBoaWdoZXIgdGhhbiBhdmVyYWdlIGluIGJsb2NrIGdyb3VwcywgcHJpbmNwYWwgY29tcG9uZW50IDEKd2lsbCBhbHNvIGluY3JlYXNlLiAKCldlIGNhbiBzYXkgdGhhdCBpbiBnZW5lcmFsIHdlIGNhbiBzYXkgdGhhdCBwcmluY2lwYWwgY29tcG9uZW50IDEgcHJpbWFyaWx5IGlzIHNlZWluZyAKY2hhcmFjdGVyaXN0aWNzIG9mIGVkdWNhdGlvbiwgd2l0aCB0aGUgaGVhdnkgZW1waGFzaXMgb24gaGlnaCBzY2hvb2wgZGlwbG9tYXMgYW5kIApiYWNoZWxvcidzIGRlZ3JlZXMuIAoKSW50ZXJwcmV0aW5nIG91ciByZXN1bHRzLCB3ZSBjYW4gc2VlIHRoYXQgdGhpcyBjYW4gYmUgdGllZCBpbnRvIGVkdWNhdGlvbiBzaW5jZSBoaXN0b3JpY2FsbHkgQmxhY2tzIGFuZCBIaXNwYW5pY3MgaGF2ZSBsb3dlciBlZHVjYXRpb24gbGV2ZWxzIGNvbXBhcmVkIHRvIFdoaXRlIAphbmQgQXNpYW4gcG9wdWxhdGlvbnMuIFRoaXMgY2FuIGNvbnRyaWJ1dGUgdG8gc29tZSBvZiB0aGUgc3BhdGlhbCBtaXNtYXRjaCAKYW1vbmdzdCBsb3ctaW5jb21lIGpvYiBzZWVrZXJzLiAKCgoKYGBge3IgZWNobz1GQUxTRX0KcGxvdChzcGF0aWFsbWlzbWF0Y2ggfiBQQzEsIGRhdGE9U2VhdHRsZTIsCiAgICAgeGxhYiA9ICJQcmluY2lwYWwgQ29tcG9uZW50IDEiLCAKICAgICB5bGFiID0gIlNwYXRpYWwgTWlzbWF0Y2giKQpjdXJ2ZShleHAoY29lZihNMTJfUENBX1NlYXR0bGUpWzJdKnggKyBjb2VmKE0xMl9QQ0FfU2VhdHRsZSlbMV0pLCBsd2Q9MiwgYWRkID1ULCBjb2wgPSJibHVlIikKCiNVc2UgY3VydmUgZml0dGluZywgb24gbm9ybWFsIHZhcmlhYmxlcyB1c2luZyBleHBvbmVudHMuIAoKYGBgCgojIyBTZWF0dGxlIDMKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CgpTZWF0dGxlMiRzcXJ0c3BhdGlhbG1pc21hdGNoPC1zcXJ0KFNlYXR0bGUyJHNwYXRpYWxtaXNtYXRjaCkKU2VhdHRsZTIkc3FydFBDMSA8LSBzcXJ0KFNlYXR0bGUyJFBDMSkKCk0xNF9QQ0FfU2VhdHRsZSA8LWxtKHNxcnRzcGF0aWFsbWlzbWF0Y2ggfiBQQzEsIGRhdGE9U2VhdHRsZTIpCgoKCnFxbm9ybShNMTRfUENBX1NlYXR0bGUkcmVzaWQpCmhpc3QoTTE0X1BDQV9TZWF0dGxlJHJlc2lkKQoKc3VtbWFyeShNMTRfUENBX1NlYXR0bGUpCgpzdW1tYXJ5KGxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSArIEkoUEMxXjIpLCBkYXRhID0gU2VhdHRsZTIpKQoKCmBgYAoKCiMjIyBTZWF0dGxlIFNwYXRpYWwgUENBIAoKRXhhY3Qgc2FtZSBtb2RlbCBhcyBvcmdpbmFsLCBkZXNwaXRlIGRpZmZlcmVudCB0cmFuc2Zvcm1hdGlvbnMKCmBgYHtyfQoKI05vcm1hbGl6aW5nIERhdGEgCgpub3JtYWxpemVkX1NlYXR0bGVTcGF0aWFsPC0gc2NhbGUoU2VhdHRsZV9zcGF0aWFsKQoKI0NvbXB1dGUgQ29ycmVsYXRpb24gTWF0cml4CgpTZWF0dGxlU3BhdGlhbGNvcnJfbWF0cml4IDwtIGNvcihub3JtYWxpemVkX1NlYXR0bGVTcGF0aWFsKQpnZ2NvcnJwbG90KFNlYXR0bGVTcGF0aWFsY29ycl9tYXRyaXgsIGNvbG9ycyA9IGMoIiNkOGIzNjUiLCAiI2Y1ZjVmNSIsICIjNWFiNGFjIikpCgojQXBwbGljYXRpb24gCgpQQ0FfU2VhdHRsZVNwYXRpYWwgPC1wcmluY29tcChTZWF0dGxlU3BhdGlhbGNvcnJfbWF0cml4KQpzdW1tYXJ5KFBDQV9TZWF0dGxlU3BhdGlhbCkKCmZ2aXpfcGNhX3ZhcihQQ0FfU2VhdHRsZVNwYXRpYWwsIGNvbC52YXIgPSAiYmxhY2siKQoKUENBX1NlYXR0bGVTcGF0aWFsJGxvYWRpbmdzWywgMToyXQoKClNlYXR0bGVTcGF0aWFscGNzPC1hcy5tYXRyaXgobm9ybWFsaXplZF9TZWF0dGxlU3BhdGlhbCAlKiUgUENBX1NlYXR0bGVTcGF0aWFsJGxvYWRpbmdzWywgMToyXSkKU2VhdHRsZVNwYXRpYWxwYyA8LSBwcmNvbXAoU2VhdHRsZV9maW5hbGl0eTMsIGNlbnRlciA9IFRSVUUsIHNjYWxlLiA9IFRSVUUpCgpTZWF0dGxlMyA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHNwYXRpYWxtaXNtYXRjaD1TZWF0dGxlX2ZpbmFsaXR5JHNwYXRpYWxtaXNtYXRjaCwgU2VhdHRsZVNwYXRpYWxwYyR4WywxOjJdKSkKCgoKYGBgCgoKIyMjU2VhdHRsZSBTcGF0aWFsIE1vZGVsIDEKCgpQQzIgaXMgbm90IHNpZ25pZmljYW50IHdlIGFyZSBnb2luZyB0byBpZ25vcmUgaXQgYW5kIGZvY3VzIG9uIHRoZSByZWxhdGlvbnNoaXAgClBDMSBhbmQgc3BhdGlhbCBtaXNtYXRjaC4gCgoKYGBge3J9CgoKI1NlYXR0bGUgU3BhdGlhbCBMaW5lYXIgUmVncmVzc2lvbiB3aXRoIFBDQQoKTTJfUENBX1NlYXR0bGVTcGF0aWFsIDwtIGxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSArIFBDMiwgZGF0YSA9IFNlYXR0bGUzKQoKTTIxX1BDQV9TZWF0dGxlU3BhdGlhbCA8LWxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSwgZGF0YT1TZWF0dGxlMykKCgoKc3VtbWFyeShNMjFfUENBX1NlYXR0bGVTcGF0aWFsKQoKCmBgYAoKCkFuYWx5emluZyBSZXNpZHVhbHMKCmBgYHtyfQpxcW5vcm0oTTIxX1BDQV9TZWF0dGxlU3BhdGlhbCRyZXNpZCkKaGlzdChNMjFfUENBX1NlYXR0bGVTcGF0aWFsJHJlc2lkKQoKI3RyYXNuZm9ybWF0aW9uIAoKU2VhdHRsZTMkbG9nc3BhdGlhbG1pc21hdGNoPC0gbG9nKFNlYXR0bGUzJHNwYXRpYWxtaXNtYXRjaCkKClNlYXR0bGUzW2lzLm5hKFNlYXR0bGUzKXwgU2VhdHRsZTMgPT0gIkluZiJ8IFNlYXR0bGUzID09ICItSW5mIl0gPSBOQQoKTTIyX1BDQV9TZWF0dGxlU3BhdGlhbDwtIGxtKGxvZ3NwYXRpYWxtaXNtYXRjaH5QQzEsIGRhdGE9U2VhdHRsZTMpCnN1bW1hcnkoTTIyX1BDQV9TZWF0dGxlU3BhdGlhbCkKCgpxcW5vcm0oTTIyX1BDQV9TZWF0dGxlU3BhdGlhbCRyZXNpZCkKCgoKCgoKYGBgCgpgYGB7cn0KCgpzdW1tYXJ5KGxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSArIEkoUEMxXjIpLCBkYXRhID0gU2VhdHRsZTMpKQoKYGBgCgoKCgoKCmBgYHtyfQoKCkJhbHRpbW9yZV9maW5hbGl0eTMgPC0gQmFsdGltb3JlX2ZpbmFsaXR5ICU+JQogIHNlbGVjdChXaGl0ZVByb3AsQXNpYW5Qcm9wLCBIaXNwYW5pY1Byb3AsIEJsYWNrUHJvcCwgaHNkaXBsb21hUHJvcCxoc25vZGlwbG9tYVByb3Asc29tZWNvbGxlZ2VQcm9wLGNvbGxlZ2UxUHJvcCxhc3NQcm9wLGJhY2hlbG9yUHJvcCkKCgojTm9ybWFsaXppbmcgRGF0YSAKCm5vcm1hbGl6ZWRfQmFsdGltb3JlPC0gc2NhbGUoQmFsdGltb3JlX2ZpbmFsaXR5MykKCiNDb21wdXRlIENvcnJlbGF0aW9uIE1hdHJpeAoKQmFsdGltb3JlY29ycl9tYXRyaXggPC0gY29yKG5vcm1hbGl6ZWRfQmFsdGltb3JlKQpnZ2NvcnJwbG90KEJhbHRpbW9yZWNvcnJfbWF0cml4LCBjb2xvcnMgPSBjKCIjZDhiMzY1IiwgIiNmNWY1ZjUiLCAiIzVhYjRhYyIpKQoKI0FwcGxpY2F0aW9uIAoKUENBX0JhbHRpbW9yZSA8LXByaW5jb21wKEJhbHRpbW9yZWNvcnJfbWF0cml4KQpzdW1tYXJ5KFBDQV9CYWx0aW1vcmUpCgpQQ0FfQmFsdGltb3JlJGxvYWRpbmdzWywgMToyXQoKZnZpel9wY2FfdmFyKFBDQV9CYWx0aW1vcmUsIGNvbC52YXIgPSAiYmxhY2siKQoKCkJhbHRpbW9yZXBjczwtYXMubWF0cml4KG5vcm1hbGl6ZWRfQmFsdGltb3JlICUqJSBQQ0FfQmFsdGltb3JlJGxvYWRpbmdzWywgMToyXSkKCkJhbHRpbW9yZXBjIDwtIHByY29tcChCYWx0aW1vcmVfZmluYWxpdHkzLCBjZW50ZXIgPSBUUlVFLCBzY2FsZS4gPSBUUlVFKQoKQmFsdGltb3JlMiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHNwYXRpYWxtaXNtYXRjaD1CYWx0aW1vcmVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBCYWx0aW1vcmVwYyR4WywxOjJdKSkKCiAKCmBgYAoKCgpgYGB7cn0KIyBCYWx0aW1vcmUgRml0dGluZyBMaW5lYXIgTW9kZWwgUENBCgoKTTFfUENBX0JhbHRpbW9yZSA8LSBsbShzcGF0aWFsbWlzbWF0Y2ggfiBQQzEgKyBQQzIsIGRhdGEgPSBCYWx0aW1vcmUyKQoKTTExX1BDQV9CYWx0aW1vcmUgPC1sbShzcGF0aWFsbWlzbWF0Y2ggfiBQQzIsIGRhdGE9QmFsdGltb3JlMikKCgpzdW1tYXJ5KE0xX1BDQV9CYWx0aW1vcmUpCgpzdW1tYXJ5KE0xMV9QQ0FfQmFsdGltb3JlKQoKcXFub3JtKE0xMV9QQ0FfQmFsdGltb3JlJHJlc2lkKQpoaXN0KE0xMV9QQ0FfQmFsdGltb3JlJHJlc2lkKQoKCgoKYGBgCiMjIyBCYWx0aW1vcmUgTW9kZWwgMiAKClRvbyBtdWNoLCBza2V3IHRvIHRoZSBsZWZ0LiAKYGBge3IsIHdhcm5pbmc9RkFMU0V9CgpCYWx0aW1vcmUyJGxvZ3NwYXRpYWxtaXNtYXRjaDwtIGxvZyhCYWx0aW1vcmUyJHNwYXRpYWxtaXNtYXRjaCkKCkJhbHRpbW9yZTJbaXMubmEoQmFsdGltb3JlMil8IEJhbHRpbW9yZTIgPT0gIkluZiJ8IEJhbHRpbW9yZTIgPT0gIi1JbmYiXSA9IE5BCgpNMTJfUENBX0JhbHRpbW9yZTwtIGxtKGxvZ3NwYXRpYWxtaXNtYXRjaCB+IFBDMiwgZGF0YT0gQmFsdGltb3JlMikKCnN1bW1hcnkoTTEyX1BDQV9CYWx0aW1vcmUpCmhpc3QoTTEyX1BDQV9CYWx0aW1vcmUkcmVzaWQpCgpgYGAKCiMjI0JhbHRpbW9yZSBNb2RlbCAzCgokJCBcd2lkZWhhdHtTcGF0aWFsIE1pc21hdGNofSA9ICh7LTAuMDAwNiBcY2RvdCBQQzIgKyAwLjI4Mn0pXjIgJCQKClRoaXMgaGFzIGFuICQkIFJeezJ9X3thZGp9ID0gMC4wMSQkIFdlIHVzZWQgYSBzcXVhcmUgcm9vdCAgdHJhbnNmb3JtYXRpb24gb24gCnNwYXRpYWwgbWlzbWF0Y2ggc2luY2UgdGhlIGxpbmVhcml0eSBtb2RlbCBoYWQgc2tld25lc3MgdG8gdGhlIHJpZ2h0IGFuZCAKbG9nYXJ0aG1pYyB0cmFuc2ZvbXJhdGlvbiB3YXMgdG9vIG11Y2guIAoKRnVydGhlcm1vcmUsCm91ciBjdXJyZW50ICQkIFJeezJ9X3thZGp9ID0wLjAyJCQgIGhhcyBkZWNyZWFzZWQgdG8gJCQgUl57Mn1fe2Fkan0gPSAwLjAxJCQuIApidXQgd2UgYXJlIGFibGUgdG8gaW50ZXJwcmV0IHRoaXMgbW9kZWwgd2l0aCBtb3JlIHNpbXBsaWNpdHkuIApEZXNwaXRlIHRoZSBzbWFsbGVyIGluY3JlYXNlIG91ciBvdXIgcHJlZGljdG9ycyB3ZSBoYXZlIGRlY2llZGVkIHRvIGdvIHdpdGggCmEgc2ltcGxlciBtb2RlbCBiZWNhdXNlIG9mIHRoZSByZWFkYWJpbGl0eSBpbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBQcmluY2lwYWwgCkNvbXBvbmVudCAyIGFuZCBTcGF0aWFsIE1pc21hdGNoLiBSZWNhbGwgdGhhdCBQcmluY2lwYWwgQ29tcG9uZW50IDIgbWFpbiBjb250cmlidXRvcnMgCndlcmUgb3VyIG9yaWdpbmFsIHZhcmlhYmxlcyAkXHRleHRpdHtCYWNoZWxvclByb3B9JCAsICAkXHRleHRpdHtXaGl0ZVByb3B9JCAsYW5kIAokXHRleHRpdHtCbGFja1Byb3B9JC4gVGhlc2UgdmFyaWFibGVzIGNvbnRyYXN0ZWQgZWFjaCBvdGhlci4gVGhlIHZhcmlhYmxlICRcdGV4dGl0e0JsYWNrUHJvcHB9JCBoYXMgYSAKbmVnYXRpdmUgd2VpZ2h0IG9mICQtMC41MCQgd2hpY2ggc3VnZ2VzdHMgdGhhdCBhcyB0aGUgcHJvcG9ydGlvbiBvZiBCbGFjayBwZW9wbGUgdGhhbiB0eXBpY2FsIGluY3JlYXNlIFByaW5jaXBhbCBDb21wb25lbnQgMiB3aWxsIGRlY3JlYXNlLiAKU2luY2UgUHJpbmNpcGFsIENvbXBvbmVudCAyIGhhcyBhIG5lZ2F0aXZlIHdlaWdodCBpbiBvdXIgb3ZlcmFsbCBtb2RlbCwgCndlIGNhbiBzYXkgdGhhdCB0aGF0IHRoZXJlIGFyZSBhIGhpZ2hlciBwcm9wb3J0aW9uIHRoYW4gYXZlcmFnZSBvZiBwZW9wbGUgd2hvIAphcmUgYmxhY2suIEFkZGl0aW9uYWxseSB3aXRoICRcdGV4dGl0e0JhY2hlbG9yUHJvcH0gPSAwLjQ2ICQgYW5kICRcdGV4dGl0e1doaXRlUHJvcH0gPTAuNDYkIGFzIHRoZXkgcHJvcG9ydGlvbnMgYXJlIGhpZ2hlciB0aGFuIHR5cGljYWwgaW4gYSBibG9jayBncm91cCwgUHJpbmNpcGFsIENvbXBvbmVudCAyIGluY3JlYXNlcy4gCgpUaGlzIHNlZW1zIHRvIHN1Z2dlc3QgdGhhdCBlZHVjdGFpb24gYW5kIHJhY2UgYXJlIGZhY3RvcnMgdGhhdCBwbGF5IGludG8gc3BhdGlhbCBtaXNtYXRjaC4gCgoKYGBge3J9CgpCYWx0aW1vcmUyJHNxcnRzcGF0aWFsbWlzbWF0Y2g8LSBzcXJ0KEJhbHRpbW9yZTIkc3BhdGlhbG1pc21hdGNoKQoKQmFsdGltb3JlMltpcy5uYShCYWx0aW1vcmUyKXwgQmFsdGltb3JlMiA9PSAiSW5mInwgQmFsdGltb3JlMiA9PSAiLUluZiJdID0gTkEKCk0xM19QQ0FfQmFsdGltb3JlPC0gbG0oc3FydHNwYXRpYWxtaXNtYXRjaCB+IFBDMiwgZGF0YT0gQmFsdGltb3JlMikKCnN1bW1hcnkoTTEzX1BDQV9CYWx0aW1vcmUpCgpoaXN0KE0xM19QQ0FfQmFsdGltb3JlJHJlc2lkKQpxcW5vcm0oTTEzX1BDQV9CYWx0aW1vcmUkcmVzaWQpCgpjYXI6OnFxUGxvdChNMTNfUENBX0JhbHRpbW9yZSRyZXNpZHVhbHMpCgpwbG90KE0xM19QQ0FfQmFsdGltb3JlJHJlc2lkIH4gTTEzX1BDQV9CYWx0aW1vcmUkZml0dGVkKQphYmxpbmUoMCwwKQoKCmBgYAojIyMgQW5hbHl6ZSBCYWx0aW1vcmUgQmVzdCBNb2RlbCAzCgpPYnNlcnZpbmcgdGhlIGRhdGEsIHdpdGggb3V0IGJlc3QgbW9kZWwsIHdlIHNlZSB0aGF0IG91ciBjdXJ2ZSBkb2Vzbid0IG1hdGNoIHRoZSBkYXRhLiAKV2l0aCBvdXIgbG93ICQkIFJeezJ9X3thZGp9ID0gMC4wMSQkIHdlIHdlcmUgbm90IGV4cGVjdGluZyBhIGdyZWF0IG1vZGVsLiBUaGlzIGRvZXMgCnN1Z2dlc3QgdGhhdCB0aGUgZmFjdG9ycyBvZiBSYWNlIGFuZCBlZHVjYXRpb24gYXIgZW5vdCBnb29kIGluZGljYXRvcnMgaW4gcHJlZGljaXRpbmcgCnNwYXRpYWwgbWlzbWF0Y2ggaW4gQmFsdGltb3JlIGFzIG11Y2ggYXMgaXQgaXMgaW4gU2VhdHRsZS4gCgoKCgpgYGB7cn0KCnBsb3Qoc3BhdGlhbG1pc21hdGNoIH4gUEMyLCBkYXRhPUJhbHRpbW9yZTIsCiAgICAgeGxhYiA9ICJQcmluY2lwYWwgQ29tcG9uZW50IDIiLCAKICAgICB5bGFiID0gIlNwYXRpYWwgTWlzbWF0Y2giKQpjdXJ2ZSgoY29lZihNMTNfUENBX0JhbHRpbW9yZSlbMl0pXjIqeF4yKzIqY29lZihNMTNfUENBX0JhbHRpbW9yZSlbMV0qY29lZihNMTNfUENBX0JhbHRpbW9yZSlbMl0qeCtjb2VmKE0xM19QQ0FfQmFsdGltb3JlKVsxXV4yKnheMiwgbHdkID0gMiwgYWRkID1ULCBjb2w9ICJibHVlIikKIAoKCmBgYAoKYGBge3J9CgoKI05vcm1hbGl6aW5nIERhdGEgCgpub3JtYWxpemVkX0JhbHRpbW9yZVNwYXRpYWw8LSBzY2FsZShCYWx0aW1vcmVfc3BhdGlhbCkKCiNDb21wdXRlIENvcnJlbGF0aW9uIE1hdHJpeAoKQmFsdGltb3JlU3BhdGlhbGNvcnJfbWF0cml4IDwtIGNvcihub3JtYWxpemVkX0JhbHRpbW9yZVNwYXRpYWwpCmdnY29ycnBsb3QoQmFsdGltb3JlU3BhdGlhbGNvcnJfbWF0cml4LCBjb2xvcnMgPSBjKCIjZDhiMzY1IiwgIiNmNWY1ZjUiLCAiIzVhYjRhYyIpKQoKI0FwcGxpY2F0aW9uIAoKUENBX0JhbHRpbW9yZVNwYXRpYWwgPC1wcmluY29tcChCYWx0aW1vcmVTcGF0aWFsY29ycl9tYXRyaXgpCnN1bW1hcnkoUENBX0JhbHRpbW9yZVNwYXRpYWwpCgpmdml6X3BjYV92YXIoUENBX0JhbHRpbW9yZVNwYXRpYWwsIGNvbC52YXIgPSAiYmxhY2siKQoKUENBX0JhbHRpbW9yZVNwYXRpYWwkbG9hZGluZ3NbLCAxOjJdCgoKQmFsdGltb3JlU3BhdGlhbHBjczwtYXMubWF0cml4KG5vcm1hbGl6ZWRfQmFsdGltb3JlU3BhdGlhbCAlKiUgUENBX0JhbHRpbW9yZVNwYXRpYWwkbG9hZGluZ3NbLCAxOjJdKQoKQmFsdGltb3JlU3BhdGlhbHBjIDwtIHByY29tcChCYWx0aW1vcmVfZmluYWxpdHkzLCBjZW50ZXIgPSBUUlVFLCBzY2FsZS4gPSBUUlVFKQoKQmFsdGltb3JlMiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHNwYXRpYWxtaXNtYXRjaD1CYWx0aW1vcmVfZmluYWxpdHkkc3BhdGlhbG1pc21hdGNoLCBCYWx0aW1vcmVTcGF0aWFscGMkeFssMToyXSkpCgoKCgpgYGAKCgoKYGBge3J9CiMgQmFsdGltb3JlIEZpdHRpbmcgTGluZWFyIE1vZGVsIFBDQQoKCk0yX1BDQV9CYWx0aW1vcmVTcGF0aWFsIDwtIGxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSArIFBDMiwgZGF0YSA9IEJhbHRpbW9yZTIpCgpNMjFfUENBX0JhbHRpbW9yZVNwYXRpYWwgPC1sbShzcGF0aWFsbWlzbWF0Y2ggfiBQQzIsIGRhdGE9QmFsdGltb3JlMikKCgpzdW1tYXJ5KE0yX1BDQV9CYWx0aW1vcmVTcGF0aWFsKQoKc3VtbWFyeShNMjFfUENBX0JhbHRpbW9yZVNwYXRpYWwpCgoKCmBgYAoKV2lsbGlhbXMgVGVzdDoKCgpgYGB7cn0KbGlicmFyeShwc3ljaCkKci50ZXN0KG4gPSAyNDc3LCBjb3IoU2VhdHRsZV9maW5hbGl0eSRzcGF0aWFsbWlzbWF0Y2gsU2VhdHRsZV9maW5hbGl0eTMkV2hpdGVQcm9wKSwgY29yKEJhbHRpbW9yZV9maW5hbGl0eSRzcGF0aWFsbWlzbWF0Y2gsQmFsdGltb3JlX2ZpbmFsaXR5JFdoaXRlUHJvcCksIG4yID0gMTkzOSwgdHdvdGFpbGVkID1UUlVFICkKYGBgCiMjI1BDQSBhbmFseXNpcyBjb21iaW5lZAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CgogIGZpbmFsPC0gZmluYWxpdHkgJT4lCiAgICBzZWxlY3QoTVNBLFdoaXRlUHJvcCxBc2lhblByb3AsIEhpc3BhbmljUHJvcCwgQmxhY2tQcm9wLCBoc2RpcGxvbWFQcm9wLGhzbm9kaXBsb21hUHJvcCxzb21lY29sbGVnZVByb3AsY29sbGVnZTFQcm9wLGFzc1Byb3AsYmFjaGVsb3JQcm9wKQoKZmluYWwkTVNBPC1pZmVsc2UoZmluYWwkTVNBPT0iU2VhdHRsZSIsMSwwKQoKI05vcm1hbGl6aW5nIERhdGEgCgpub3JtYWxpemVkX2ZpbmFsPC0gc2NhbGUoZmluYWwpCgojQ29tcHV0ZSBDb3JyZWxhdGlvbiBNYXRyaXgKCmNvcnJfbWF0cml4IDwtIGNvcihub3JtYWxpemVkX2ZpbmFsKQpnZ2NvcnJwbG90KGNvcnJfbWF0cml4LCBjb2xvcnMgPSBjKCIjZDhiMzY1IiwgIiNmNWY1ZjUiLCAiIzVhYjRhYyIpKQoKI0FwcGxpY2F0aW9uIAoKUENBX2ZpbmFsIDwtcHJpbmNvbXAoY29ycl9tYXRyaXgpCnN1bW1hcnkoUENBX2ZpbmFsKQoKZnZpel9wY2FfdmFyKFBDQV9maW5hbCwgY29sLnZhciA9ICJjb3MyIiwgZ3JhZGllbnQuY29scyA9IGMoImJsYWNrIiwgIm9yYW5nZSIsICJncmVlbiIpLHJlcGVsID0gVFJVRSkKCgoKUENBX2ZpbmFsJGxvYWRpbmdzWywgMToyXQoKZmluYWxwY3M8LWFzLm1hdHJpeChub3JtYWxpemVkX2ZpbmFsICUqJSBQQ0FfZmluYWwkbG9hZGluZ3NbLCAxOjJdKQpmaW5hbHBjIDwtIHByY29tcChmaW5hbCwgY2VudGVyID0gVFJVRSwgc2NhbGUuID0gVFJVRSkKCmZpbmFsMiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHNwYXRpYWxtaXNtYXRjaD1maW5hbGl0eTMkc3BhdGlhbG1pc21hdGNoLCBmaW5hbHBjJHhbLDE6Ml0pKQoKCgpgYGAKCgojIyNGaW5hbCByZWdyZXNzaW9uCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCiMgTGluZWFyIFJlZ3Jlc3Npb24gd2l0aCBQQ0EKCk0zX1BDQV9maW5hbDwtIGxtKHNwYXRpYWxtaXNtYXRjaCB+IFBDMSArIFBDMiwgZGF0YSA9IGZpbmFsMikKCnN1bW1hcnkoTTNfUENBX2ZpbmFsKQoKcXFub3JtKE0zX1BDQV9maW5hbCRyZXNpZCkKaGlzdChNM19QQ0FfZmluYWwkcmVzaWQpCgoKZmluYWwyJGxvZ3NwYXRpYWxtaXNtYXRjaCA8LSBsb2coZmluYWxpdHkzJHNwYXRpYWxtaXNtYXRjaCkKCmZpbmFsMltpcy5uYShmaW5hbDIpfCBmaW5hbDIgPT0gIkluZiJ8IGZpbmFsMiA9PSAiLUluZiJdID0gTkEKCk0zMV9QQ0FfZmluYWw8LSBsbShsb2dzcGF0aWFsbWlzbWF0Y2ggfiBQQzEgKyBQQzIsIGRhdGEgPSBmaW5hbDIpCgpzdW1tYXJ5KE0zMV9QQ0FfZmluYWwpCgpjYXI6OnFxUGxvdChNMzFfUENBX2ZpbmFsJHJlc2lkKQpoaXN0KE0zMV9QQ0FfZmluYWwkcmVzaWQpCgoKCmBgYAoKIyMjIFdpbGxpYW0ncyBUZXN0CgpgYGB7cn0KY29yKGZpbmFsMiRzcGF0aWFsbWlzbWF0Y2gsZmluYWwyJFBDMSkKY29yKGZpbmFsMiRzcGF0aWFsbWlzbWF0Y2gsZmluYWwyJFBDMikKCnIudGVzdChuID0gMjQ3NywgY29yKGZpbmFsMiRzcGF0aWFsbWlzbWF0Y2gsZmluYWwyJFBDMSksY29yKGZpbmFsMiRzcGF0aWFsbWlzbWF0Y2gsZmluYWwyJFBDMiksIG4yID0gMTkzOSwgdHdvdGFpbGVkID1UUlVFICkKCgoKYGBgCgpjb21iaW5lIGNvbXBvbmVudHMgYW5kIHRoZW4gZmluZCB0aGUgY29ycmVsYXRpb25zLiAKc3BhdGlhbCBtaXNtYXRjaCBpcyByZWxhdGVkIHRvIGRpZmZlcmVudCBjb21wb25lbnRzIGFuZCB0aGVuIHRyeSBjaXRpZXMKCmNvbWJpbmUgZGlmZmVyZW50IGNpdGllcyBpbnRvIG9uZSBQQ0EgYW5kIHRoZW4gcnVuIGNvcnJlbGF0aW9ucyBiYXNlZCBvbiBQQy4gCgouLi4KCgo=